package nsu.edu.zsq.service.sys;

import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.multipart.MultipartFile;

import com.github.pagehelper.PageInfo;

import nsu.edu.zsq.bean.SchClass;
import nsu.edu.zsq.bean.Status;
import nsu.edu.zsq.bean.Student;
import nsu.edu.zsq.param.PageQuery;

/** 
* Description: 学校班级的service类<br>
*/
public interface SchClassService {
    
    /**
     * 通过班级id获取一个班级信息
     * @param id 班级id
     * @return SchClass
     */
    public SchClass getSchClass(int id);
    
    /**
     * 通过专业代码获取班级的分页数据
     * @param majorNo 专业代码
     * @param pageQuery 分页数据
     * @return PageInfo<SchClass>
     */
    public PageInfo<SchClass> listSchClassWithPageByMajorNo(String majorNo, PageQuery pageQuery);
            
    /**
     * 批量保存班级信息
     * @param listSchClass 班级信息列表
     */
    public void saveBatchSchClass(List<SchClass> listSchClass);
    
    /**
     * 保存一条班级信息
     * @param schClass 班级信息
     */
    public void saveSchClass(SchClass schClass);
    
    /**
     * 批量删除班级信息
     * @param ids 班级id数组
     */
    public void deleteBatchSchClass(int[] ids);
    
    /**
     * 删除一条班级信息
     * @param id 班级id
     */
    public void deleteSchClass(int id);
    
    /**
     * 更新一条班级信息
     * @param schClass 班级信息
     */
    public void updateSchClass(SchClass schClass);
    
    /**
     * 根据专业代码获取带有分页信息的学生列表<br>
     * 用于给班级添加学生，已经有班级的学生不再显示
     * @param majorNo 专业代码
     * @param pageQuery 分页数据
     * @return PageInfo<Student>
     */
    public PageInfo<Student> listStudentByMajorNoWithPage(String majorNo, PageQuery pageQuery);
    
    /**
     * 根据班级id获取带有分页信息的学生列表<br>
     * 用于“班级管理”中显示班级学生信息
     * @param classId 班级id
     * @param pageQuery 分页数据
     * @return PageInfo<Student>
     */
    public PageInfo<Student> listStudentByClassIdWithPage(int classId, PageQuery pageQuery);
    
    /**
     * 为单个学生添加班级
     * @param stuId 学生id
     * @param classId 班级id
     */
    public void addStuToClass(int stuId, int classId);
    
    /**
     * 批量学生添加班级
     * @param stuId 学生id数组
     * @param classId 班级id
     */
    public void addBatchStuToClass(int[] stuIds, int classId);
    
    /**
     * 将单个学生移出班级
     * @param stuId 学生id
     */
    public void deleteStuFromClass(int stuId);
    
    /**
     * 批量学生移出班级
     * @param stuIds 学生id
     */
    public void deleteBatchFromClass(int[] stuIds);
    
    /**
     * 从excel文件导入班级信息
     * @param excelFile 上传的excel文件
     */
    public void importSchClassFromExcel(MultipartFile excelFile);
    
    /**
     * 导出班级信息到excel文件（xlsx格式）
     * @param response
     */
    public void exportSchClassToExcel(HttpServletResponse response);
    /**
     * 导入班级和学生的关联信息
     * @param excelFile 上传的excel文件
     */
    public void exportStuToClass(MultipartFile excelFile);
    
    
    // =========================教学班级===========================
    /**
     * 获取教学班级（查找有授课教室的选修课程）
     * @param majorNo 专业代码
     * @param courseType 课程类型
     * @param pageQuery 分页信息
     * @return PageInfo<SchClass>
     */
    public PageInfo<SchClass> listTeachClassWithPage(String majorNo, int courseType, PageQuery pageQuery);

    /**
     * 获取当前系统选课的开启状态
     * @return int 0：关闭选课 1：开启选课
     */
    public int chooseCourseState();

    /**
     * 更新系统的选课状态信息
     * @param status 系统状态信息
     */
    public void updateStatus(Status status);

    /**
     * 获取所有该课程下的学生信息
     * @param tchCourseId 教师课程id
     * @param pageQuery 分页信息
     * @return PageInfo<Student>
     */
    public PageInfo<Student> listTeachClassStudent(int tchCourseId, PageQuery pageQuery);

    /**
     * 单个/批量删除学生选课信息
     * @param stuCourseIds 学生课程id
     */
    public void delStuCourse(int[] stuCourseIds);

}
